package com.nts.pmchelperdemo3.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nts.pmchelperdemo3.dto.MachineLatestScheduleDTO;
import com.nts.pmchelperdemo3.dto.SchedulingDTO;
import com.nts.pmchelperdemo3.dto.SchedulingDetailDTO;
import com.nts.pmchelperdemo3.entity.Scheduling;

import java.util.List;

/**
 * 排班服务接口（核心业务）
 */
public interface SchedulingService {

    /**
     * 为指定订单生成排班计划
     *
     * @param orderId  订单ID
     * @param taskType 任务类型（0-磨刀，1-涂层）
     */
    List<SchedulingDTO> generateScheduling(Long orderId, Integer taskType);

    /**
     * 根据订单ID查询排班计划
     * @param orderId 订单ID
     * @return 排班计划DTO列表
     */
    List<SchedulingDTO> getSchedulingByOrder(Long orderId);

    /**
     * 根据机器ID查询排班计划
     * @param machineId 机器ID
     * @param date 日期（可选，格式yyyy-MM-dd）
     * @return 排班计划DTO列表
     */
    List<SchedulingDTO> getSchedulingByMachine(Long machineId, String date);

    /**
     * 手动调整排班计划
     * @param schedulingId 排班计划ID
     * @param schedulingDTO 调整后的排班信息
     * @return 调整后的排班计划DTO
     */
    SchedulingDTO adjustScheduling(Long schedulingId, SchedulingDTO schedulingDTO);

    /**
     * 根据当前时间同步订单状态（自动更新：如磨刀中→磨刀完成）
     */
    void syncOrderStatusByTime();

    /**
     * 合并符合条件的订单（相同刀具+交付日期差≤3天）
     * @param newOrderId 新订单ID
     * @return 合并后的订单ID（若无可合并订单则返回原ID）
     */
    Long mergeOrdersIfPossible(Long newOrderId);

    /**
     * 查询所有排班计划以及最晚完成时间
     * @return 全部排班计划及其最晚完成时间
     */
    List<MachineLatestScheduleDTO> getAllSchedulingsWithEndTime();

    /**
     * 查询排班计划详情
     * @param page 页面
     * @return 全部排班详情
     */
    IPage<SchedulingDetailDTO> getSchedulingDetail(Page<SchedulingDetailDTO> page);

    /**
     * 移除低优先级的排班计划
     * @param newOrderPriority
     * @return
     */
    List<Scheduling> removeLowerPrioritySchedulings(Integer newOrderPriority);
}
